Skip to content

Conversation

@siuunni
Copy link

@siuunni siuunni commented Sep 20, 2025

  • pyfixest(https://www.tidy-finance.org/python/difference-in-differences.html), statsmodels 패키지 소개 및 기본 예제 설명을 추가했습니다.
  • 기본적인 구현은 실무로 통하는 인과추론 with python책을 기반으로 하였습니다.
  • 사전 평행 추세 검증 코드는 아직 해당 파일에 담지않았습니다.
    • 이유
      · 해당 데이터에서 R^2가 지나치게 낮아 해석이 어렵다고 판단
      · 관련 문헌 검토 결과, 단순 DID 셋업에서 사전평행추세를 이 방식으로 확인하는 예시는 드물어 제외
  • 사전평행추세 검증은 추후 문헌 학습 후 보완하여 추가할 예정입니다.

감사합니다.

@siuunni
Copy link
Author

siuunni commented Sep 27, 2025

커밋 명 week2 did으로 파일 업데이트를 했습니다.
금주에는

  • 2WFE did
  • 공변량이 있는 did
  • dml을 이용한 did with 사전 평행 추세

에 대한 코드를 작성하였습니다.

<참고 자료>

  1. 실무로 통하는 인과추론 with 파이썬
  2. https://docs.doubleml.org/stable/examples/did/py_did.html
  3. https://docs.doubleml.org/stable/examples/did/py_did_pretest.html
  4. https://www.tidy-finance.org/python/fixed-effects-and-clustered-standard-errors.html#clustering-standard-errors

다음주에는 event study와 이중강건 이중차분법에 대한 내용을 업로드 할 계획입니다.

감사합니다.

@siuunni siuunni changed the title did week 1 update book/ate/did.ipynb with new version did Sep 27, 2025
@siuunni
Copy link
Author

siuunni commented Oct 5, 2025

상아님 말씀해주신 목차와 유형별 DID 장단점 내용을 코드에 반영했습니다!

감사합니다!

@siuunni
Copy link
Author

siuunni commented Oct 11, 2025

  • DiD의 전체 개념도를 추가하여 코드를 읽을때 구조적으로 받아 들일 수 있도록 했습니다.
  • DRDiD,event study,Strggered DiD 내용을 추가하였습니다.
  • 코드 결과 해석도 추가하였습니다.

다음번에는 DDD와 Event study을 통해 사전평행추세를 검정하는 다양한 방법을 구현하고자 합니다.

참고로 할 논문은 Pretest with Caution: Event-Study Estimates after Testing for Parallel Trends입니다.

@MinSeok1o28 MinSeok1o28 requested review from MinSeok1o28 and removed request for MinSeok1o28 October 12, 2025 09:19
@myeongseok-gwon myeongseok-gwon removed the request for review from sanakang0615 October 18, 2025 12:37
@siuunni
Copy link
Author

siuunni commented Oct 18, 2025

복구된 노트 기반으로 DDD 및 Event Study F-test 예시 추가했습니다.
dml-DiD도 동일한 데이터셋을 쓸수있도록 수정하였습니다.

감사합니다.

@siuunni
Copy link
Author

siuunni commented Oct 25, 2025

데이터 설명과 개념을 3.5 Doubly Robust Diff-in-Diff (DRDiD)까지 수정 및 추가했습니다.

다음에는 전체 코드 흐름을 매끄럽게 정리할 예정입니다.

참고자료 : 실무로 통하는 인과추론 with python

@Soyoung-JUN
Copy link
Contributor

안녕하세요 시은님.
코드와 해석 잘 확인하였습니다. 잘 작성해주신 덕분에 DiD에 대해서 더 배울 수 있었네요. 감사합니다.
설명에서 헷갈릴 수 있는 부분이 있어 전달드립니다.

Event Study 결과 해석

  • "T-검정 결과 ~ 관찰되지 않았습니다. 이는 평행추세 가정(parallel trends assumption) 이 충족되었음을 의미하며~" 와 뒤에 나오는 "F-검정 결과, 사전 13개 시점의 처치효과를 동시에 검정한 결과 F 통계량은 4.77, p-값은 0.0001 미만으로 나타나 평행추세 가정이 통계적으로 유의하게 위배되었습니다." 내용이 상충되는 것 같습니다.
  • 제가 알기로는, 평행추세 가정은 처치 전 모든 시점에서 효과가 동시에 0이어야 한다는 공동 가설이고, 이를 검증하는 것은 F-검정입니다. 그리고 T-검정은 개별 시점만 볼 뿐, 이를 직접 확인하지 못하는 것으로 알고 있습니다. 따라서, T-검정에서 PTA 언급 부분을 수정하시는 것을 제안드립니다.

혹시, 제가 잘못 알고 있다면 말씀 부탁드립니다.
좋은 코드 공유해주셔서 감사합니다!

@siuunni
Copy link
Author

siuunni commented Nov 1, 2025

소영님 리뷰해주셔서 감사합니다!ㅎㅎ

  • 제가 처음에 의도한 것은 두 가지 가설 검정 방법을 통해 평행가정 추세 위반이 얼마나 달라지는 지 보이고자 했습니다. 제가 오개념을 가지고 있었습니다 ㅜ 말씀해주신것처럼 더 알아보니 t-test는 event-study에서 평행추세 가정 검정을 할 때 모든 시점에서 처치효과가 0이여야 평행추세 가정이 충족된다는 것을 알게되었습니다. 감사합니다! ㅎㅎ
  • 모든 개별 시점에서 효과가 0임이 유의한지 확인하는 코드의 근거는 아래 double_ml 패키지에 있는 예시를 통해 구현한 것입니다! Double did에서도 사전평행추세 검정을 t-test하였는데 그 흐름을 잇고자 코드를 넣어두었습니다. https://docs.doubleml.org/stable/examples/did/py_did_pretest.html
  • 말씀해주신 것 처럼 t-test는 개별 시점만 보긴 하나 각 시점에 대해 각각 t-test를 진행하여 모두 처치효과가 0임이 유의하게 나온다면 이또한 평행추세 검정을 할 수 있습니다.

소영님 꼼꼼히 리뷰해주셔서 감사합니다!!ㅎㅎ 말씀해주신 부분 반영하여 수정해 업로드 하겠습니다!!

@siuunni
Copy link
Author

siuunni commented Nov 1, 2025

straggerd DiD 설명을 추가하고 성은님께서 리뷰해주신 내용 반영해서 수정했습니다!

@Soyoung-JUN
Copy link
Contributor

Soyoung-JUN commented Nov 2, 2025

시은님, 답변 정말 감사합니다!
말씀해주신 doubleml 예시도 좋은 레퍼런스네요. 저도 잘 참고하겠습니다.

그리고 작성해주신 코드를 다시 검토하면서 몇가지 궁금한 점이 있어 코멘트 남깁니다.

  1. 사전/사후 유의성 판정 부호 관련; plot_event_study()에서 pre 구간 분기에서
    <Pre-treatment - significant vs non-significant>
    pre_sig = pre_treat[pre_treat['pvalue'] > alpha_level]
    pre_nonsig = pre_treat[pre_treat['pvalue'] <= alpha_level]

라고 써주셨는데 아래 post_와 부호방향이 반대더라구요. p-value가 alpha보다 큰 (즉,. 유의하지 않은) 시점을 pre_sig 변수에 할당한 것 같습니다. 그래서 F-test와 T-test 결과가 달랐던 건 아닌지 검토 부탁드립니다.

  1. "DML을 이용한 DID" 파트에서 작성해주신 코드를 확인했으나 제가 헷갈리는 부분이 있어서 문의 남깁니다ㅠ
    (1) 패널 키 지정(단위/시간): DoubleMLDID가 DID 구조를 인지하려면 보통 개체 키와 시간 키(예: i_col/t_col 또는 unit_col/time_col)가 필요하다고 알고 있습니다. (다른 섹션들은 statsmodels에서 C(city), C(date)로 고정효과를 공식에 직접 넣어 패널 구조를 처리하지만, DML-DID는 ML 기반 누이즈모형을 따로 학습하기 때문) 현재 예시에서 어떤 컬럼을 단위/시간으로 전달하셨는지 궁금합니다.
    (2) 제 환경에선 공변량(x_cols) 구성에 city 더미가 포함된 것으로 보였는데, 혹시 의도하신 구성인지 궁금합니다.

시은님이 작성해주신 코드 덕분에 DiD에 대해서 더 공부할 수 있었습니다.
항상 감사합니다!

@siuunni
Copy link
Author

siuunni commented Nov 2, 2025

소영님 리뷰 감사합니다!

  • 일단 이전에 t-test와 f-test해석이 반대였던 이유는 대부분의 시점에서처치효과가 0이면 평행 추세가정이 만족되는 것으로 이해했습니다. 그런데 말씀해주신 것처럼 처치 이전 모든 시점에서 처치효과가 0이여야 해당 가정이 충족되므로 지금 수정한 해석에선 해당 내용이 반영되어 있습니다.
  • 부호를 반대로 한 이유는 사전 평행 추세 가정은 다음과 같이 귀무 가설과 대립가설이 구성되어있는 것으로 알고 있습니다.
    $$H_0 : \text{처치효과} =0 \text{ vs } H_1 : \text{처치효과}!=0$$
    위의 p-values가 유의 수준보다 작으면 귀무가설을 기각할 수 있게 되고 유의미하게 처치효과가 0이 아니다라고 해석합니다.즉 평행 추세 가정이 만족되려면 처치 이전에는 처치효과가 0이여야하니 귀무가설을 기각하면 안됩니다. 즉, p-values가 유의 수준보다 커야함을 의미합니다. 따라서 평행 추세 가정을 만족하는 시점을 찾으려면 처치 이전 시점에서는 p-values가 유의수준보다 큰 시점을 찾아야 합니다. 반대로 처치 이후에는 처치효과가 0이 아닌 시점이 효과가 있다고 대립가설을 채택하는 방향 즉 귀무가설을 기각하는 시점을 찾아야합니다. 이 경우 p-value가 사전에 설정한 유의수준보다 낮아야 귀무가설을 기각할 수 있습니다.
    그래서 처치 이전 시점과 이후 시점에서 유의미한 시점을 찾는 부호가 반대입니다. 아래 f-test에서 평행추세가정이 만족되는 코드도 위와 같은 흐름입니다ㅎㅎ
if f_test.pvalue > 0.05:
        print(f"\n✓ Cannot reject H0 (p={f_test.pvalue:.4f} > 0.05)")
        print("  → Pre-treatment parallel trends assumption is satisfied")
    else:
        print(f"\n✗ Reject H0 (p={f_test.pvalue:.4f} < 0.05)")
        print("  → Pre-treatment parallel trends assumption is violated")
    print("=" * 60)
  • "DML을 이용한 DID"파트는 제가 시간 변수는 지정을 해야했는데 놓친것같습니다. 해당 double-ml에서 파이썬 시간 변수를 지정하는 것 까진 확인했는데 단위부분은 따로 지정하는 파라메터를 못봐서 그냥 공변량에 추가하였습니다! 좀 더 공부해서 확인해보겠습니다!1

감사합니다 ㅎㅎ

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants